//实现面向切片编程 用户写法片段抽离的底层轮子
Function.prototype.before = function (cb) {
  console.log('调试：执行顺序2');
  //fn.before -> 谁调用指向谁 -> fn
  //this -> 业务代码的函数(用户定义)
  var _self = this;

  return function () {
    console.log('调试：执行顺序5');

    //执行before里面的回调函数
    var res = cb.apply(_self, arguments);

    console.log('调试：执行顺序8');
    console.log('文件读取完毕');

    // console.log(res);
    //res -> 读取文件后的结果

    //执行this函数
    //将before函数执行完毕的返回值作为参数传入用户定义函数
    return _self.call(_self, res);
  }

}

Function.prototype.after = function (cb) {
  console.log('调试：执行顺序3');

  //这里的this是before内部返回的函数本身
  var _self = this;

  return function () {
    console.log('调试：执行顺序4');

    //执行this函数
    //拿到读取文件后的结果
    var res = _self.apply(_self, arguments);

    console.log('调试：执行顺序10');

    //执行after里面的回调函数
    cb.call(_self, res)

    //实现用户编写的函数的返回值
    return res;
  }
}